Immutable Rails Cache Header, Local Assigns in Strict Local Templates, Threaded Active Storage Mirror Service | This Week in Rails
Immutable Rails Cache Header, Local Assigns in Strict Local Templates, Threaded Active Storage Mirror Service
Support immutable directive in Cache-Control by heka1024 · Pull Request #52197 · rails/rails · GitHub
ActionPackに関する変更です
Cache-Control ヘッダーの immutable ディレクティブがサポートされました
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#immutable
immutable ディレクティブは、特定のリソースが将来変更されないことをブラウザに伝えるために使用されます
これにより、そのリソースが一度キャッシュされたあと再検証やダウンロードが不要になるため、パフォーマンスが向上します
適切に活用していきたいですね
Also pass local_assigns to strict locals templates by casperisfine · Pull Request #52205 · rails/rails · GitHub
ActionViewに関する変更です
Viewテンプレートへの変数の受け渡しに関する話です
前提知識として locals に関して話します
https://railsguides.jp/layouts_and_rendering.html#ローカル変数を渡す
よくある例を示します(↑を参考にしました)
code:new.html.erb
<h1>New book</h1>
<%= render partial: "form", locals: {book: @book} %>
code:form.html.erb
<%= form_with model: book do |form| %>
<p>
<b>Title</b><br>
<%= form.text_field :title %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
ちなみに locals: が実装されたプルリクエストはこちらです: Allow templates to define which locals they accept by joelhawksley · Pull Request #45602 · rails/rails · GitHub
code:before.html.erb
<%# issues/_card.html.erb %>
<% title = local_assigns:title || "Default title" %>
<% comment_count = local_assigns:comment_count || 0 %>
<h2><%= title %></h2>
<span class="comment-count"><%= comment_count %></span>
code:after.html.erb
<%# issues/_card.html.erb %>
<%# locals: (title: "Default title", comment_count: 0) %>
<h2><%= title %></h2>
<span class="comment-count"><%= comment_count %></span>
今回のプルリクエストに関するドキュメントの更新が別プルリクエストで出されていました
Document undefined local_assigns when using Strict Locals with defaults by bensheldon · Pull Request #52209 · rails/rails · GitHub
To access a local variable with a default value that is named the same as a reserved Ruby keyword, like class or if, the values can be accessed through binding.local_variable_get:
code:html
<%# locals: (class: "message") %>
<div class="<%= binding.local_variable_get(:class) %>">...</div>
Rubyの予約語と同じ名前のローカル変数を参照したい場合、
これまでは local_assigns をつかって参照していた
しかし local_assigns では locals で指定したデフォルト値は無視されるので困っていた
今回のプルリクエストで binding.local_variable_get を使えるようになった
これにより、デフォルト値を考慮したうえで参照できるようになった
とのことです
Improve performance in ActiveStorage::Service::MirrorService by heka1024 · Pull Request #51740 · rails/rails · GitHub
ActiveStorageに関する変更です
ActiveStorage::Service::MirrorService というクラスがあります
複数のストレージサービスに対して同時にファイルを保存できるようにするためのサービスです
ファイルの冗長性を確保したり、異なるストレージサービスを併用したい場合に役立ちます
Railsガイド https://railsguides.jp/active_storage_overview.html#ミラーサービス によると
ミラーサービスは、production環境でサービス間の移行期で一時的に利用するための機能です。新しいサービスへのミラーリングを開始し、既存のファイルを古いサービスから新しいサービスにコピーしてから、新しいサービスに全面的に移行できます。
ストレージサービスを移行する際に利用することを想定された機能のようですね
このプルリクエストでは、スレッドプールを使用してMirrorServiceの処理を並列化することでパフォーマンスの向上を行なっています